// 首次加载应用时调用此函数以获取并保存CSRF Token
// async function fetchAndStoreCsrfToken() {
//   try {
//     const response = await fetch('/get-csrf-token');
//     const data = await response.json();
//     localStorage.setItem('csrfToken', data.csrf_token);
//   } catch (error) {
//     console.error('Failed to fetch CSRF token:', error);
//   }
// }


/**
 * 封装http请求
 * @param { String } url 请求地址
 * @param { String } method 请求方法
 * @param { Object } data 请求数据
 * @param { Object= } options 请求选项
 * @param { String } options.baseURL 请求的baseURL
 * @param { Object } options.headers 请求的headers
 * @param { boolean } options.lazy   是否在加载路由后才请求该异步方法，默认为false
 * @param { boolean } options.server  是否在服务端请求数据，默认为true
 * @return {Promise}
 */
async function request(url, method, data, options) {
  return new Promise((resolve, reject) => {
    const userStore = useUserStore();
    const menuStore = useMenuStore();
    const { token } = userStore;
    const config = useRuntimeConfig();

    const baseURL = config.public.serverUrl;

    // if (!localStorage.getItem('csrfToken')) {
    //   fetchAndStoreCsrfToken();
    // }
    // 继承UseFetchOptions类型，包含了baseURL和method两个属性
    const newOptions = {
      baseURL,
      timeout: 30 * 1000,
      method,
      headers: {},
      credentials: 'include',
      ...options,
    };
    // if (token) {
    //   newOptions.headers.Authorization = token;
    // }
    const setOptKey = (ele) => {
      if (queryURLParams("optkey")) {
        window.localStorage.setItem(
          "optKey",
          window.location.href.split(ele)[1],
        );
      }
      if (window.localStorage.getItem("optKey")) {
        newOptions.headers.Optkey = window.localStorage.getItem("optKey");
      }
    };
    // 山大附正式机后端用作权限判断
    // if (config.public.appPath == "production") {
    //   setOptKey("/production");
    // }
    // if (config.public.appPath == "test") {
    //   setOptKey("/test");
    // }

    // 根据请求方法处理请求的数据
    if (method === "GET" || method === "DELETE") {
      // 将数据设置为newOptions的params属性
      newOptions.params = data;
    }
    if (method === "POST" || method === "PUT") {
      // const csrfToken =localStorage.getItem('csrfToken');
      // if (csrfToken) {
      //   newOptions.headers['X-CSRF-TOKEN'] = csrfToken;
      // }
      // 将数据设置为newOptions的body属性
      newOptions.body = data;
    }

    // 发送请求

    $fetch(url, newOptions)
      .then((response) => {
        if (
          response.code === 1 ||
          response.code === 0 ||
          response.code === 201 ||
          response.code === 203

        ) {
          resolve(response);
        }
        // else if (response.code === 401) {
        //   ElMessageBox.confirm("当前页面已失效，请重新登录", "提示", {
        //     confirmButtonText: "确定",
        //     type: "warning",
        //   }).then(() => {
        //     userStore.$reset();
        //     menuStore.$reset();
        //     toLogin();
        //   });
        // }
        else {
          // 202 === code 接口请求正确，返回错误数据
          // 响应数据为二进制流处理(Excel导出)
          if (response instanceof ArrayBuffer) {
            reject(response);
            return;
          }
          ElMessage({
            message: response.msg || "系统出错",
            type: "error",
          });
          reject(response);
        }
      })
      .catch((error) => {
        // let errorMsg = error.response.status;
        // if (errorMsg === 401) {
        //   ElMessageBox.confirm("当前页面已失效，请重新登录", "提示", {
        //     confirmButtonText: "确定",
        //     type: "warning",
        //   }).then(() => {
        //     userStore.$reset();
        //     menuStore.$reset();
        //     toLogin();
        //   });
        // } else {
        //   ElMessage({
        //     message: error.msg || "系统出错",
        //     type: "error",
        //   });
        // }
        reject(error);
      });
  });
}

/**
 * get post put del 请求
 * @param {String} url 请求地址
 * @param {Object} params 请求参数
 * @param {Object=} options 请求选项
 * @param { String } options.baseURL 请求的baseURL
 * @param { Object } options.headers 请求的headers
 * @param { boolean } options.lazy   是否在加载路由后才请求该异步方法，默认为false
 * @param { boolean } options.server  是否在服务端请求数据，默认为true
 * @return {Promise}
 */
export function get(url, params, options) {
  return request(url, "GET", params, options);
}

export function post(url, data, options) {
  return request(url, "POST", data, options);
}

export function put(url, data, options) {
  return request(url, "PUT", data, options);
}

export function del(url, data, options) {
  return request(url, "DELETE", data, options);
}
